iT邦幫忙

2023 iThome 鐵人賽

DAY 16
2
Modern Web

什麼!在網頁上也可以寫遊戲?系列 第 16

[Day 16] 變數的實際應用-等級系統

  • 分享至 

  • xImage
  •  

我之前在 [Day 07] 事件表實作 - 檢查篇(下) 這篇文章中,介紹了何謂變數,並且又在 [Day 09] 變數的型別與作用範圍 介紹了變數的型別與作用範圍,後來又在 [Day 13] 為自己的遊戲添加排行榜吧! 將變數作為分數使用,但我還沒有一步步的帶各位使用這個功能,所以今天我要來帶各位實作一個跟變數非常有關係的系統。

先來說說我們今天的規劃吧,我們今天要來實作一個幾乎每個 RPG 遊戲都會有的功能——等級系統,主要是包含等級、經驗值、獲取經驗值、提升等級,而獲取經驗值的管道就是擊殺小怪,所以還會有能夠無限復活的怪物,那就讓我們開始吧!

初始化

首先我們新增一個事件——初始化,要來定義玩家的等級資料,畢竟這些可不會憑空出現,先想想等級系統中可能會出現那些數字,等級經驗值升級所需經驗值,大多數的遊戲都是等級越高,升級越慢,因為升級所需的經驗值也在上升,這三個都是會變動的數字,所以我們需要三個變數來儲存他們,因此我分別設定了 level = 1exp = 0maxExp = 20 三個變數。

接著我們還需要一些可憐的小怪,作為我們獲取經驗值的來源,所以我在事件中新增了兩個角色——盜賊嘍囉經驗球,並且分別將他們各自放在一個專屬的事件中,事件名稱都是以 生成 作為前綴,加上他們的角色代碼,至於這麼做的用途,待會再來揭曉。

我還另外新增了一個事件——初始化怪物經驗值,用來定義每個怪物會掉落的經驗值數量,變數名稱裡面同樣包含了怪物的角色代碼,並且使用 _exp 作為後綴,當然這其實也可以放在初始化的事件裡面就好了,但考慮到一個 RPG 遊戲中可能會有幾十個,甚至是上百個怪物,所以建議額外新增事件來分類這些變數。

好了,一開始會執行的事件就是這些,該定義的資料都有了,怪物也有了,接下來就是要來真正實作等級系統了。

擊殺怪物獲取經驗值

我們先來處理怪物的部分,擊殺怪物之後除了讓玩家獲得經驗值,還記得我們要讓怪物可以重生嗎,這就是為什麼我將一開始的角色生成分別放在不同的事件當中。

我們先來看怪物重生的部分,光暈其實有內建可以讓角色重生,但有一些問題,第一點是重生的次數有限,雖然可以設定到 1000000 這種幾乎不可能消耗完的次數,但心裡就是有些疙瘩,不過這還不是最重要的,第二點,就是角色重生時會有幾秒鐘的無敵狀態,這可不是我們要的,所以我們要在怪物消失後,重新放置一個一模一樣的怪物,來達到怪物重生的效果。

如上圖,我使用觸發 角色死亡,來偵測角色代碼內包含 monster_ 的角色死亡,也就是符合怪物條件的角色,並且將該角色的代碼儲存在區域變數 instance 裡面,這時候可能已經有些聰明人想到了,我只要利用這個角色代碼,不就可以找到對應的經驗值變數,和重生事件了嗎?

沒錯!所以我在第一個動作,也就是用來增加經驗值的動作內,填寫了 exp = {exp} + {{instance.code}_exp},以往儲存角色代碼的變數,我們都可以直接使用 {instance} 將其取出來即可,但某些時候連我也不知道為什麼會失效,一定要在後面加上 .code 才行,總之我們可以利用 {instance.code} 來讀取死亡的角色代碼,萬一哪天你也讀取了角色代碼,卻發現事件總是失敗的時候,不妨可以在後面加上 .code 看看,或是每次都加上 .code 就可以確保不會出現類似的問題了。

假設今天死亡的角色是 monster_0 那麼 {{instance.code}_exp} 就會等於 {monster_0_exp},之後又解析了 {monster_0_exp} 為 4,所以 exp 就會自己加 4 了,當然如果今天死亡的是 monster_1,那麼 exp 就會加 100。

接著我在動作裡延遲了一秒鐘,然後利用 觸發事件,並在 欲觸發的事件代碼 欄位填寫了 生成{instance},同樣的系統在執行前會先針對 {} 進行解析,從而得到對應的事件名稱後才執行事件,例如 生成monster_0生成monster_1,這樣就能夠達成角色死亡後,自動重生的效果了。

檢查升等

接著讓我們進入正題,也就是關於升等事件的處裡,首先第一個問題,什麼情況下會升等呢?那自然就是經驗值到達升級所需經驗值得時候,也就是我們的變數 exp >= maxExp 的時候,所以讓我們來新增一個事件——檢查是否升等

如上圖我新增了一個檢查——比較數字,並在裡面填寫了 {exp} >= {maxExp},不要忘記了在事件表中,帶入變數需要使用 {},忘了加這個事件表就會出錯給你看,並且我在動作裡面改變了這三個變數的內容,level = {level} + 1exp = {exp} - {maxExp}maxExp = {maxExp} + 5,等級加 1 這個不用說,比較需要注意的是每次升級時,經驗值應該是要減去升級所需經驗值,而不是直接歸零才對,這樣才會保留玩家溢出的經驗值,我曾經看到有人會把經驗值直接歸零,所以補充一下,至於升級所需經驗值我設定成每次升級都會加 5,這個部分就看各位的設計如何了,當然不會成長也是可以的。

剩下的兩個動作就只是升級時的音效與特效而已,也是看各位的喜好去添加即可,並不會影響到我們的系統。

記得由於這個事件需要重複執行,所以 重覆次數 要設為 -1,才不會玩家升了一等之後事件就不會動了。

到此為止等級系統可以說是已經完成了,但我們再來補充一個功能,不然我們要怎麼知道我們現在幾等呢?

查看個人資料

新增一個事件——F鍵查看資料,並且利用觸發 鍵盤按鍵,來偵測玩家按下 F 鍵的瞬間,會執行 角色說話 說出以下的內容。

等級:{level}
經驗值:{exp} / {maxExp}

同樣的這個事件的重複次數也要設為 -1,這樣我們就可以不斷的通過 F 鍵來檢查自身的等級資料了。

好了,讓我們來測試看看最後的成品吧!

在我擊殺了一次盜賊嘍囉之後,經驗值就變成了 4,看起來沒有什麼問題,接著讓我們來打經驗值有 100 的經驗球吧!

哦!一顆經驗球就讓我們升到 4 等了,不錯,看來我們的等級系統已經完成了。

CG 範例事件表

總結

今天用實作系統的方式,來帶各位更加了解變數的應用,當然變數的用途可是無窮無盡的,什麼情況之下都有可能會用到,而我挑選這個實作的原因,除了跟各位介紹變數的應用以外,還有一點是為了明天做準備,今天的實作我留了一些可以優化的地方,不知道各位有沒有發現呢?

另外我之前介紹參考事件的時候,我只針對檢查中的否則觸發事件做介紹而已,但那並不是參考事件唯一的用途,加上昨天我介紹了何謂函數,所以明天的重點就是以參考事件為主,要來跟各位介紹如何利用參考事件將某個過程給函數化,讓我們在事件表的製作上可以更加便利。


上一篇
[Day 15] 事件表中的數學函數
下一篇
[Day 17] 參考事件的實際應用-函數事件
系列文
什麼!在網頁上也可以寫遊戲?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
p123298
iT邦新手 5 級 ‧ 2023-10-04 11:26:35

原來還能這樣設定怪物的變數

看更多先前的回應...收起先前的回應...
酷可 iT邦新手 4 級 ‧ 2023-10-04 11:36:33 檢舉

沒錯,將怪物生成的動作以事件分開,以及使用變數儲存每個怪物的經驗值,都是為了讓我們能夠只用一個事件就處裡所有怪物的重生和經驗獲取。

如果不這麼做的話,每次要增加怪物時都得額外新增一個事件來特別處理,到後面就累死自己了ˊˇˋ

p123298 iT邦新手 5 級 ‧ 2023-10-04 12:17:09 檢舉

呃,不好意思
我遇到了一些問題
1.怪物死掉後沒有重生,不過有拿到經驗值
2.按F鍵後,角色沒說話https://ithelp.ithome.com.tw/upload/images/20231004/20163841GgFe9VaFN5.jpg

p123298 iT邦新手 5 級 ‧ 2023-10-04 12:34:47 檢舉

F鍵查看資料的部分沒有問題了
將動作的角色代碼改成{player.id}後能順利執行
https://ithelp.ithome.com.tw/upload/images/20231004/20163841zh3F96Z3Ns.jpg

酷可 iT邦新手 4 級 ‧ 2023-10-04 12:44:11 檢舉

怪物死亡後有掉落經驗值卻沒有重生,代表觸發事件可能出了什麼問題,但我單純這樣看感覺都很正常,可能要看看動作或觸發內的其他設定了。

至於按下 F 鍵後,角色沒有說話,這一點我忘記補充了,.code 是專門針對藉由光暈模組所儲存的角色代碼所使用的,而 鍵盤按鍵 本身並不是光暈模組附加的觸發,而是事件表模組本身自帶的,所以儲存代碼的方式有所不同,從下圖可以看到欄位提示中有提到,該區域變數包含了 id, username, name, iconUrl, guest 這些屬性,其中 id 才是代表玩家代碼的意思。

p123298 iT邦新手 5 級 ‧ 2023-10-04 14:43:58 檢舉

了解,感謝您的補充
怪物重生的問題有解決了,我把【觸發事件】的動作移動到【等待】前面後就能順利執行了
剛才測試了幾場,放在【等待】後面的話都會無法運作,不知道原因https://ithelp.ithome.com.tw/upload/images/20231004/20163841z5oOzUT0su.jpghttps://ithelp.ithome.com.tw/upload/images/20231004/20163841FvLdYX5c32.jpg

p123298 iT邦新手 5 級 ‧ 2023-10-04 15:34:14 檢舉

可能是【角色死亡】的觸發時機不對
原本預設的時機是【結束】,我改成【即將死亡】
之後把【觸發事件】放在【等待】後面也能順利執行https://ithelp.ithome.com.tw/upload/images/20231004/20163841eJyeVRJ3Me.jpg

我要留言

立即登入留言